#include<stdio.h>
#include<queue>
using namespace std;
const int maxn=1e3+10;
char map[maxn][maxn];
int p[maxn][maxn];
int s[2][4]{
  0,0,-1,1,
  1,-1,0,0,
};
int m,n;
struct node{
	int x,y;
	int step;
}S,T,next;
bool text(int x,int y)
{
	if(x<0||y<0||x>=m||y>=n)
		return false;
	if(p[x][y]||map[x][y]=='*')
		return false;
	return true;
}
int BFS()
{
	queue<node> q;
	q.push(S);
	node top=q.front();
	q.pop();
	if(top.x==T.x&&top.y==T.y)
		return top.step;
	for(int i=0;i<4;i++){
		int nx=top.x+s[0][i];
		int ny=top.y+s[1][i];
		if(text(nx,ny)){
			next.x=nx;
			next.y=ny;
			next.step=top.step+1;
			q.push(next);
			p[nx][ny]=1;
		}
	}
	return -1;
}
int main()
{
	scanf("%d%d",&m,&n);
	for(int i=0;i<m;i++){
		getchar();
		for(int j=0;j<n;j++){
			scanf("%c",&map[i][j]);
		}
	}
	scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
	printf("%d",BFS());
	return 0;
}
